﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Resources.Req;
using OT.HikiSecureCenterApis.Service.Resources.Res;
using OT.HikiSecureCenterApis.Service.Video.Res;

namespace OT.HikiSecureCenterApis.Service.Resources
{
    public partial class ResourcesService
    {
        /// <summary>
        /// 查询资源列表v2 /api/irds/v2/resource/resourcesByParams
        /// 根据条件查询目录下有权限的资源列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResResources"/></returns>
        public async Task<ResParameter<ResPageData<ResResources>>?> ResourcesByParamsAsync(ReqResourcesSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResResources>>("/api/irds/v2/resource/resourcesByParams", 1.3, req);
        /// <summary>
        /// 根据区域获取下级资源列表v2 /api/irds/v2/resource/subResources
        /// 根据区域编码、资源类型、资源操作权限码分页获取当前区域下（不包含子区域）有权限的资源列表，主要用于逐层获取区域下的资源信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="regionIndexCode">必填 父区域编号</param>
        /// <param name="page">必填 页面，页大小</param>
        /// <param name="resourceType">必填 资源类型
        /// 资源类型;详见附录A.2 资源类型
        /// 查询资源的类型，传region时查询的为用户有配置权限的区域树，
        /// 传资源类型如：camera、encodeDevice查询用户对该类资源有权限的区域树；
        /// 注：资源iasDevice\reader\floor不进行权限校验，即不传authCodes
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#ae7cd6c8
        /// 区域	region 门禁控制器 acsDevice 门禁点 door 门禁读卡器 reader 编码设备 encodeDevice 监控点 camera 报警输入 ioIn 报警输出 ioOut
        /// 入侵报警-报警主机 iasDevice 入侵报警-子系统 subSys 入侵报警-防区通道 defence 入侵报警-雷达设备 radarDevice 可视对讲设备 visDevice
        /// 可视对讲-室内机 visDeviceInDoor 可视对讲-门口机 visDeviceOutDoor 可视对讲-围墙机 visDeviceWallDoor 可视对讲-管理机 visDeviceManager
        /// 梯控-控制器 ecsDevice 梯控-读卡器 ladderCardReader 梯控-楼层 floor 动环设备 peDevice 动环-开关量 pemsIoOut 动环-传感器 transducer 
        /// 动环-环境量 sensor 停车场-抓拍机 snapshot 停车场-显示屏 led 停车场-出入口控制机 inoutControl 停车场-道闸 barrierGate
        /// 停车场-蓝牙读卡器 bluetoothReader 停车场-远距离读卡器 rfiReader 停车场-诱导管理器 guideManager 停车场-诱导/引导屏幕 guideLed
        /// 停车场-地磁管理器 geoManage 园区-卡口设备 monitoringPointDevice 园区-卡口点 monitoringPoint 园区-显示屏 gardenLed
        /// 紧急报警设备 emerdevice 对讲通道 talk 电锁 electricLock 警灯 alarmLamp 警号 siren
        /// </param>
        /// <param name="authCodes"> 非必填 权限码集合 ; String[]，详见附录A.3 资源权限码中的编码设备对应的资源权限码 ,权限码个数<=20个； 
        /// 单个权限码长度<=40Byte； 当authCodes为空时，则不进行权限过滤； 当authCodes为空时，则只返回对应权限码的资源信息
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#c92e73ec
        /// </param>
        /// <returns><see cref="ResResources"/></returns>
        public async Task<ResParameter<ResPageData<ResResources>>?> SubResourcesAsync(string regionIndexCode, ReqPage page, string resourceType, IList<string> authCodes = null) =>
          await SecureCenterApis.PostAsync<ResPageData<ResResources>>("/api/irds/v2/resource/subResources", 1.3, new
          {
              regionIndexCode = regionIndexCode,
              resourceType = resourceType,
              authCodes = authCodes,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 20
          });
        /// <summary>
        /// 获取资源列表v2 /api/irds/v2/deviceResource/resources
        /// 根据资源类型分页获取资源列表，主要用于资源信息的全量同步。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="page">必填 页面，页大小</param>
        /// <param name="resourceType">必填 资源类型
        /// 资源类型;详见附录A.2 资源类型
        /// 查询资源的类型，传region时查询的为用户有配置权限的区域树，
        /// 传资源类型如：camera、encodeDevice查询用户对该类资源有权限的区域树；
        /// 注：资源iasDevice\reader\floor不进行权限校验，即不传authCodes
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#ae7cd6c8
        /// 区域	region 门禁控制器 acsDevice 门禁点 door 门禁读卡器 reader 编码设备 encodeDevice 监控点 camera 报警输入 ioIn 报警输出 ioOut
        /// 入侵报警-报警主机 iasDevice 入侵报警-子系统 subSys 入侵报警-防区通道 defence 入侵报警-雷达设备 radarDevice 可视对讲设备 visDevice
        /// 可视对讲-室内机 visDeviceInDoor 可视对讲-门口机 visDeviceOutDoor 可视对讲-围墙机 visDeviceWallDoor 可视对讲-管理机 visDeviceManager
        /// 梯控-控制器 ecsDevice 梯控-读卡器 ladderCardReader 梯控-楼层 floor 动环设备 peDevice 动环-开关量 pemsIoOut 动环-传感器 transducer 
        /// 动环-环境量 sensor 停车场-抓拍机 snapshot 停车场-显示屏 led 停车场-出入口控制机 inoutControl 停车场-道闸 barrierGate
        /// 停车场-蓝牙读卡器 bluetoothReader 停车场-远距离读卡器 rfiReader 停车场-诱导管理器 guideManager 停车场-诱导/引导屏幕 guideLed
        /// 停车场-地磁管理器 geoManage 园区-卡口设备 monitoringPointDevice 园区-卡口点 monitoringPoint 园区-显示屏 gardenLed
        /// 紧急报警设备 emerdevice 对讲通道 talk 电锁 electricLock 警灯 alarmLamp 警号 siren
        /// </param>
        /// <returns><see cref="ResResources"/></returns>
        public async Task<ResParameter<ResPageData<ResResources>>?> ResourcesAsync(string resourceType, ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResResources>>("/api/irds/v2/deviceResource/resources", 1.3, new
          {
              resourceType = resourceType,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 20
          });
        /// <summary>
        /// 增量获取资源数据 /api/resource/v1/resource/timeRange
        /// 根据资源类型、时间段增量获取资源，包含已删除数据。其中开始日期与结束日期的时间差必须在1-48小时内。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填 页面，页大小，开始时间，结束时间</param>
        /// <param name="resourceType">必填 资源类型
        /// 资源类型;详见附录A.2 资源类型
        /// 查询资源的类型，传region时查询的为用户有配置权限的区域树，
        /// 传资源类型如：camera、encodeDevice查询用户对该类资源有权限的区域树；
        /// 注：资源iasDevice\reader\floor不进行权限校验，即不传authCodes
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#ae7cd6c8
        /// 区域	region 门禁控制器 acsDevice 门禁点 door 门禁读卡器 reader 编码设备 encodeDevice 监控点 camera 报警输入 ioIn 报警输出 ioOut
        /// 入侵报警-报警主机 iasDevice 入侵报警-子系统 subSys 入侵报警-防区通道 defence 入侵报警-雷达设备 radarDevice 可视对讲设备 visDevice
        /// 可视对讲-室内机 visDeviceInDoor 可视对讲-门口机 visDeviceOutDoor 可视对讲-围墙机 visDeviceWallDoor 可视对讲-管理机 visDeviceManager
        /// 梯控-控制器 ecsDevice 梯控-读卡器 ladderCardReader 梯控-楼层 floor 动环设备 peDevice 动环-开关量 pemsIoOut 动环-传感器 transducer 
        /// 动环-环境量 sensor 停车场-抓拍机 snapshot 停车场-显示屏 led 停车场-出入口控制机 inoutControl 停车场-道闸 barrierGate
        /// 停车场-蓝牙读卡器 bluetoothReader 停车场-远距离读卡器 rfiReader 停车场-诱导管理器 guideManager 停车场-诱导/引导屏幕 guideLed
        /// 停车场-地磁管理器 geoManage 园区-卡口设备 monitoringPointDevice 园区-卡口点 monitoringPoint 园区-显示屏 gardenLed
        /// 紧急报警设备 emerdevice 对讲通道 talk 电锁 electricLock 警灯 alarmLamp 警号 siren
        /// </param>
        /// <returns><see cref="ResDeviceSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResDeviceSearch>>?> ResourceTimeRangeAsync(string resourceType, ReqPageDate page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResDeviceSearch>>("/api/resource/v1/resource/timeRange", 1.4, new
          {
              resourceType = resourceType,
              startTime = page?.startTime,
              endTime = page?.endTime,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 500
          });
        /// <summary>
        /// 根据编号查询资源详细信息 /api/resource/v1/resource/indexCodes/search
        /// 根据资源类型、资源编号查询单个资源详细信息及总条数，列表中资源类型必须一致。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="resourceIndexCodes">必填 资源编号，根据获取资源列表v2接口获取返回参数indexCode，最大1000个</param>
        /// <param name="resourceType">必填 资源类型
        /// 资源类型;详见附录A.2 资源类型
        /// 查询资源的类型，传region时查询的为用户有配置权限的区域树，
        /// 传资源类型如：camera、encodeDevice查询用户对该类资源有权限的区域树；
        /// 注：资源iasDevice\reader\floor不进行权限校验，即不传authCodes
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#ae7cd6c8
        /// 区域	region 门禁控制器 acsDevice 门禁点 door 门禁读卡器 reader 编码设备 encodeDevice 监控点 camera 报警输入 ioIn 报警输出 ioOut
        /// 入侵报警-报警主机 iasDevice 入侵报警-子系统 subSys 入侵报警-防区通道 defence 入侵报警-雷达设备 radarDevice 可视对讲设备 visDevice
        /// 可视对讲-室内机 visDeviceInDoor 可视对讲-门口机 visDeviceOutDoor 可视对讲-围墙机 visDeviceWallDoor 可视对讲-管理机 visDeviceManager
        /// 梯控-控制器 ecsDevice 梯控-读卡器 ladderCardReader 梯控-楼层 floor 动环设备 peDevice 动环-开关量 pemsIoOut 动环-传感器 transducer 
        /// 动环-环境量 sensor 停车场-抓拍机 snapshot 停车场-显示屏 led 停车场-出入口控制机 inoutControl 停车场-道闸 barrierGate
        /// 停车场-蓝牙读卡器 bluetoothReader 停车场-远距离读卡器 rfiReader 停车场-诱导管理器 guideManager 停车场-诱导/引导屏幕 guideLed
        /// 停车场-地磁管理器 geoManage 园区-卡口设备 monitoringPointDevice 园区-卡口点 monitoringPoint 园区-显示屏 gardenLed
        /// 紧急报警设备 emerdevice 对讲通道 talk 电锁 electricLock 警灯 alarmLamp 警号 siren
        /// </param>
        /// <returns><see cref="ResDeviceSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResDeviceSearch>>?> OnlineHistorAsync(string resourceType, IList<string> resourceIndexCodes) =>
          await SecureCenterApis.PostAsync<ResPageData<ResDeviceSearch>>("/api/resource/v1/resource/indexCodes/search", 1.4, new
          {
              resourceIndexCodes = resourceIndexCodes,
              resourceType = resourceType,
          });
    }
}
